/*
 *  需求提高一下，现在要求有哪些物品了
 * */


#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    // 那这边为了方便测试，就不整输入输出了
    int n = 4, m = 8;
    int w[5] = {0, 2, 3, 4, 5};
    int v[5] = {0, 3, 4, 5, 6};

    vector<vector<int>> dp(n + 1, vector<int>(m + 1));
    // 这里就先不用初始化为0了，放在函数作用域外就是默认都是0
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            if (j < w[i]) { // 背包的体积容量不够啊
                dp[i][j] = dp[i - 1][j];
            } else { // 那容量够也是要分放与不放两种情况的
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
            }
        }
    }
    // 输出结果
    cout << dp[n][m] << endl;

    // 在这个地方进行回溯
    vector<int> obj;

    int i = n, j = m;
    while (i != 0) {
        if (dp[i][j] == dp[i - 1][j]) {
            --i;
        } else {
            obj.push_back(i);
            j -= w[i];
            --i;
        }
    }

    for (const auto item : obj) {
        cout << item << " ";
    }
    cout << endl;
    return 0;
}